用 tinyxml2 解析 xml
Cocos2d-x 已经加入了tinyxml2用于xml的解析。具体用法用例参见官方文档
需要说明的是不同的乐谱软件导出的 MusicXML 可能有所区别,可能其中有些信息并不是 MusicXML 所规定的,而是乐谱软件根据自身需要出发所添加的。解析的话我根据我游戏的需求以及难度,只解析了必要的信息。
MusicXML 解析思路整理
divisions
这个元素把我搞得很晕,简单来说 divisions
的值确定了整个乐谱的最小单位。而音符的时值 duration
的值就是根据最小单位来的。divisions = 1
的话,则最小单位是四分音符;divisions = 2
的话,则最小单位是四分音符,以此类推。举例来说,同样都是全音符,在 division = 1
的乐谱中,全音符的 duration = 4
;在 division = 2
的乐谱中,全音符的 duration = 8
.
所以呢:
最小单位 = (4 * divisions)分音符 = 1 / (4 * divisions)
一拍的duration = 一个beat-type分音符的duration = (4 / beat-type)个四分音符的duration = 4 * divisions / beat-type
一小节的duration = beats * 4 * divisions / beat-type
一个全音符的duration = 4 * divisions
tinyxml2 loadFile真机下失败问题(原文链接)
直接用tinyxml2的loadFile,加载一个XML文件,在WIN PC下是可以的,但在真机下失败:
const char* filepath = "test.xml";
tinyxml2::XMLDocument* xmlfile = new tinyxml2::XMLDocument();
auto ret = xmlfile->loadFile(filepath); //这里失败
改为:
const char* filepath = "test.xml";
tinyxml2::XMLDocument* xmlfile = new tinyxml2::XMLDocument();
auto content = CCFileUtils::getInstance()->getDataFromFile(filepath);
auto ret = xmlfile->Parse((const char*)content.getBytes(), content.getSize());